package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.dao.ProvinciaDAO;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Departamento;
import com.divemotor.ventarepuestosinternet.model.Provincia;


@Repository(value = "provinciaDAO")
public class ProvinciaDAOImpl implements ProvinciaDAO , Serializable{
 
	private static final long serialVersionUID = -9150772624840980546L;
	
	@Autowired
	private SessionFactory sessionFactory;

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Provincia> listarProvinciasPorDepartamento(Provincia provincia)
			throws DivemotorBusinessException {
		
		return getSessionFactory().getCurrentSession().createQuery(
								"from Provincia p where p.departamento.idDepartamento = :idDepartamento ")
								.setParameter("idDepartamento", provincia.getDepartamento().getIdDepartamento()).list();
	}

	@Override
	public Provincia obtenerPorCodigoId(Provincia provincia) {
		return (Provincia) sessionFactory.getCurrentSession().get(Provincia.class, provincia.getIdProvincia());
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Provincia> listarProvinciasPorDepartamento(Departamento departamento) {
		Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Provincia.class, "provincia");
		criteria.createAlias("provincia.departamento", "departamento");
		criteria.add(Restrictions.eq("provincia.departamento", departamento));
		return criteria.list();
	}

}
